#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Filename: exam_svm.py
# 支持向量机的模型评估

import pandas as pd
# 用来把数据集中的标签转化成0,1的数字标识
from sklearn.preprocessing import LabelEncoder
# 数据预处理：数据标准化:归一化
from sklearn.preprocessing import StandardScaler
# 用来分割数据集为测试集和训练集两部分
# from sklearn.cross_validation import train_test_split
from sklearn.model_selection import train_test_split
# 用来规范数据流向的管线
from sklearn.pipeline import Pipeline
# SVC是SVM的升级版
from sklearn.svm import SVC
# 混淆矩阵
from sklearn.metrics import confusion_matrix
# 画图
import matplotlib.pyplot as plt
# 查准率，查全率，f1_score：F1分数(F1 Score),是统计学中用来衡量二分类模型精确度的一种指标。
from sklearn.metrics import precision_score, recall_score, f1_score

file = pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data",
                   header=None)
# print(file)

# 取数据中所有的行以及第2列以后的列
X = file.loc[:, 2:].values
# 获取所有的行以及第二列
y = file.loc[:, 1].values

le = LabelEncoder()
# 类标整数化
y = le.fit_transform(y)

# 将数据划分成训练集和测试集
# test_size：测试集的比例，这里是20%
# random_state：数据选取方式，当为整数的时候，这个整数就是随机器的种子
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=1)
# 在管线中定义数据的操作：对数据进行标准化：归一化；再就是随机抽取的方式分离训练集和测试集
pip_scv = Pipeline([('scl', StandardScaler()), ('clf', SVC(random_state=1))])
# 开始训练
pip_scv.fit(X_train, y_train)

# 开始预测
y_pred = pip_scv.predict(X_test)

# 输出真实值
print("y_test=\n", y_test)
# 输出预测值
print("y_pred=\n", y_pred)

# 混淆矩阵处理
conf_mat = confusion_matrix(y_true=y_test, y_pred=y_pred)

fig, ax = plt.subplots(figsize=(2.5, 2.5))

ax.matshow(conf_mat, cmap=plt.cm.Blues, alpha=0.3)

for i in range(conf_mat.shape[0]):
    for j in range(conf_mat.shape[1]):
        ax.test(x=j, y=i, s=conf_mat[i, j], va='center', ha='center')
